<?php
use frontend\modules\yii2\widgets\layouts\markdown\Markdown;

$this->title = 'Yii应用组件的学习和使用-Components组件';
$this->registerMetaTag([
    'name' => 'keywords',
    'content' => 'yii,yii2,框架,应用组件,Components,使用,教程'
]);
$this->registerMetaTag([
    'name' => 'description',
    'content' => 'Yii的应用组件给系统提供了各种各样功能的支持，是Yii框架必不可少的组成部分。'
]);
$this->registerMetaTag([
    'name' => 'author',
    'content' => 'chenzhiwei'
]);


$html = [
    "概述" => <<<HTML
# Yii应用组件（Components）的学习和使用
在一次请求中，会涉及各种各样的功能，比如：数据库操作、缓存管理、日志管理、路由管理等，Yii把这些功能模块当作一个个应用组件进行管理。在本章中我们会研究各种组件的使用方法。

## 核心组件 id=core-components
我们在`config.php`文件中定义组件的初始化参数，然后应用主体（`\yii\base\Application`的子类）就会创建应用组件的实例提供各种各样的功能，Yii提供了如下这些核心组件：
```php
class Application extends \yii\base\Application
{
    public function coreComponents()
    {
        return [
            'log' => ['class' => 'yii\log\Dispatcher'],
            'view' => ['class' => 'yii\web\View'],
            'formatter' => ['class' => 'yii\i18n\Formatter'],
            'i18n' => ['class' => 'yii\i18n\I18N'],
            'mailer' => ['class' => 'yii\swiftmailer\Mailer'],
            'urlManager' => ['class' => 'yii\web\UrlManager'],
            'assetManager' => ['class' => 'yii\web\AssetManager'],
            'security' => ['class' => 'yii\base\Security'],
            
            // web application
            'request' => ['class' => 'yii\web\Request'],
            'response' => ['class' => 'yii\web\Response'],
            'session' => ['class' => 'yii\web\Session'],
            'user' => ['class' => 'yii\web\User'],
            'errorHandler' => ['class' => 'yii\web\ErrorHandler'],
            
            // console application
            //'request' => ['class' => 'yii\console\Request'],
            //'response' => ['class' => 'yii\console\Response'],
            //'errorHandler' => ['class' => 'yii\console\ErrorHandler'],
        ];
    }
}
```
> 注意：控制器应用（`yii\console\Application`）比web应用（`yii\web\Application`）少两个组件：`session`和`user`，因此可以看出控制器应用无法使用权限管理和会话管理功能。

HTML,
    "组件访问方法" => <<<HTML
## 组件访问方法 id=access
您可以在一个请求的生命周期中随时访问组件，访问方式如下：
```php
Yii::\$app->componentID
```
`componentID`是组件id，举例如下：
```php
// 访问数据库组件
Yii::\$app->db

// 访问日志组件
Yii::\$app->log

// 访问缓存组件
Yii::\$app->catch
```
当组件在没有被使用时，是不会被实例化的，只有在第一次使用时才会被创建，创建后整个请求的生命周期都可以被使用。

HTML,
    "引导启动组件" => <<<HTML
## 引导启动组件 id=bootstrap
上面提到一个应用组件只会在第一次访问时实例化， 如果处理请求过程没有访问的话就不实例化。 有时你想在每个请求处理过程都实例化某个组件即便它不会被访问， 可以将该组件ID加入到应用主体的 bootstrap 属性中：
```php
[
    'bootstrap' => [
        'log',
        function(\$app){
            return new ComponentX();
        },
        function(\$app){
            // 可以写自定义的代码
           return;
        }
    ],
    'components' => [
        'log' => [
            // "log" 组件的配置
        ],
    ],
]
```
HTML
];


echo Markdown::widget(["content" => implode("\n", $html)]);

